﻿#pragma once

#include "ais_point.h"
#include "ais_pole.h"

namespace CAGD
{

/**
 * 交互相机.
 */
class AIS_Camera : public AIS_Point
{
  public:
    /**
     * @brief 基本构造.
     * @param pos
     * @see
     */
    AIS_Camera(Handle(GeomPoint) pos);

    /**
     * @brief 获得视图矩阵.
     * @return
     * @see
     */
    BMat4x4 GetViewMatrix() const;

    /**
     * @brief 刷新信息.
     * @return
     * @see
     */
    void UpdateInfo() override;

    /**
     * @brief 获得类型.
     * @return
     * @see
     */
    AIS_Type GetType() const override;

    /**
     * @brief 接收消息.
     * @param mess
     * @see
     */
    void RecvMessage(Message mess) override;

  protected:
    /**
     * @brief 通过欧拉角计算方向向量.
     * @see
     */
    void UpdateCameraVectors();

  protected:
    BVecf m_front; // 指向原点的方向
    BVecf m_up;    // 正交于向前方向的上方
    BVecf m_right; // 正交于向前方向的右方

    // 欧拉角：俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll)，我们不需要用到滚转角
    float m_pitch; // 与 z 轴的夹角
    float m_yaw;   // 与 x 轴的夹角
};

} // namespace CAGD
